package com.yskj.mwk.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

// 模拟数据点类，包含中文文本和标签
class ChineseDataPoint {
    String text;
    String label;

    ChineseDataPoint(String text, String label) {
        this.text = text;
        this.label = label;
    }
}

// 模拟模型类，这里使用一个简单的词袋模型
class SimpleChineseModel {
    // 词汇表，用于将文本转换为向量
    Map<String, Integer> vocabulary;
    // 模型权重，与词汇表中的单词对应
    double[] weights;

    SimpleChineseModel(List<ChineseDataPoint> dataset) {
        // 构建词汇表
        vocabulary = new HashMap<>();
        int index = 0;
        for (ChineseDataPoint data : dataset) {
            String[] words = data.text.split(" ");
            for (String word : words) {
                if (!vocabulary.containsKey(word)) {
                    vocabulary.put(word, index++);
                }
            }
        }
        // 初始化权重
        weights = new double[vocabulary.size()];
        for (int i = 0; i < weights.length; i++) {
            weights[i] = new Random().nextDouble();
        }
    }

    // 将文本转换为向量
    double[] textToVector(String text) {
        double[] vector = new double[weights.length];
        String[] words = text.split(" ");
        for (String word : words) {
            if (vocabulary.containsKey(word)) {
                vector[vocabulary.get(word)] += 1.0;
            }
        }
        return vector;
    }

    // 预测函数
    String predict(String text) {
        double[] vector = textToVector(text);
        double maxScore = Double.NEGATIVE_INFINITY;
        String predictedLabel = null;
        // 这里假设标签也是通过某种方式编码为数字的，但为了简化，我们使用标签字符串
        Map<String, Double> labelScores = new HashMap<>();
        for (ChineseDataPoint data : trainingData) {
            double score = dotProduct(vector, dataToVector(null));
            labelScores.put(data.label, labelScores.getOrDefault(data.label, 0.0) + score);
            if (score > maxScore) {
                maxScore = score;
                predictedLabel = data.label;
            }
        }
        // 在实际应用中，我们可能会选择得分最高的标签，但这里为了简化，我们直接返回预测的标签
        return predictedLabel;
    }

    // 点积函数
    double dotProduct(double[] vector1, double[] vector2) {
        double sum = 0.0;
        for (int i = 0; i < vector1.length; i++) {
            sum += vector1[i] * vector2[i];
        }
        return sum;
    }

    // 训练数据
    List<ChineseDataPoint> trainingData;

    // 训练函数
    void train(List<ChineseDataPoint> dataset) {
        this.trainingData = dataset;
        // 这里只是一个简单的训练循环，实际情况会复杂得多
        for (int epoch = 0; epoch < 10; epoch++) {
            for (ChineseDataPoint data : dataset) {
                double[] vector = textToVector(data.text);
                // 简单地更新权重
                for (int i = 0; i < weights.length; i++) {
                    weights[i] += 0.01 * (1.0 - dotProduct(vector, dataToVector(null)));
                }
            }
            System.out.println("Epoch " + epoch + " completed.");
        }
    }

    // 辅助函数，将数据点转换为向量
    double[] dataToVector(ChineseDataPoint data) {
        return textToVector(data.text);
    }
}

// 主类
public class ChineseLanguageModelTrainer {
    public static void main(String[] args) {
        // 模拟数据集
        List<ChineseDataPoint> dataset = new ArrayList<>();
        dataset.add(new ChineseDataPoint("你是开什么店", "positive"));
        dataset.add(new ChineseDataPoint("采购 供应 平台", "neutral"));
        dataset.add(new ChineseDataPoint("价格 优势", "negative"));
        dataset.add(new ChineseDataPoint("但是口味 不同 支持 第一次 合作试样试吃", "negative"));
        dataset.add(new ChineseDataPoint("起早贪黑的 我们直接 给你 配货 物流方便 冷琏保鲜 周期配货", "negative"));
        dataset.add(new ChineseDataPoint("价格 对 比下 你自己 卤制成本", "negative"));
        dataset.add(new ChineseDataPoint("然后 你 试下 品 看下 我们的 品质 口味", "negative"));
        dataset.add(new ChineseDataPoint("你 可以 选择 我们 工厂 长期 合作了", "negative"));
        dataset.add(new ChineseDataPoint("商品 标注 平台上 备注了", "negative"));
        dataset.add(new ChineseDataPoint("你在 平台 上面 直接 下单", "negative"));
        dataset.add(new ChineseDataPoint("地址 填写 清楚", "negative"));
        dataset.add(new ChineseDataPoint("今天 下午 我就 帮你 安排 发货", "negative"));

        // 创建模型
        SimpleChineseModel model = new SimpleChineseModel(dataset);

        // 训练模型
        model.train(dataset);

        // 测试模型
        String testText = "好吃吗，你们的卤味";
        String prediction = model.predict(testText);
        System.out.println("Prediction for \"" + testText + "\": " + prediction);
    }
}
